
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>当zookeeper挂了之后，生产者和消费者之间还能通信吗？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>当zookeeper挂了之后，生产者和消费者之间还能通信吗？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在 Dubbo 架构中，ZooKeeper 扮演的核心角色是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在 Dubbo 中，ZooKeeper 作为注册中心，核心角色是负责服务的注册与发现。服务提供者将服务注册到 ZooKeeper，而服务消费者则通过 ZooKeeper 查找可用的服务提供者。</div>
          </div>
          <div class="card-source">来源: 1. 注册中心的角色</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当 ZooKeeper 注册中心宕机后，为什么已经建立通信的 Dubbo 消费者和提供者还能继续调用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">这是因为 Dubbo 会将从 ZooKeeper 获取的服务提供者列表缓存到本地内存中。即使 ZooKeeper 挂掉，Dubbo 消费者依然可以利用这个本地缓存来获取提供者的地址，从而继续进行 RPC 调用。</div>
          </div>
          <div class="card-source">来源: 3. 现有的通信是否受影响</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">场景</div>
          <div class="card-question">如果 ZooKeeper 挂掉了，会对 Dubbo 系统的服务动态管理造成哪些具体影响？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">场景</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要影响有两点：1. 服务注册受影响，新的服务提供者无法注册，现有的也无法更新状态。2. 服务发现受影响，新的消费者无法发现服务，现有的消费者也无法感知服务提供者的状态变化（如新增或下线）。</div>
          </div>
          <div class="card-source">来源: 2. ZooKeeper 挂掉后的影响</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当宕机的 ZooKeeper 恢复正常后，Dubbo 系统是如何恢复其服务注册与发现功能的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当 ZooKeeper 恢复后，服务提供者会重新向其注册服务并更新状态。同时，服务消费者会重新通过 ZooKeeper 获取最新的服务提供者列表，并刷新自己的本地缓存。</div>
          </div>
          <div class="card-source">来源: 4. 恢复后的情况</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">容错</div>
          <div class="card-question">在 ZooKeeper 宕机期间，如果某个服务提供者也恰好宕机，会引发什么问题？Dubbo 提供了哪些机制来应对？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">容错</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">问题在于，服务消费者无法通过 ZooKeeper 感知到该提供者的下线，可能会继续向其发起调用，从而导致调用失败。为了减轻这种影响，Dubbo 提供了多种容错机制，例如失败重试、快速失败和失败转移。</div>
          </div>
          <div class="card-source">来源: 5. 极端情况下的问题</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">为什么说 Dubbo 中服务消费者和提供者之间的 RPC 调用是无状态的，这在 ZooKeeper 宕机时有什么好处？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为 RPC 调用本身不依赖于注册中心的持续在线状态。只要消费者知道提供者的地址并且提供者仍在运行，调用就可以继续。这个特性结合本地缓存机制，保证了即使注册中心（ZooKeeper）宕机，现有的服务通信也不会中断。</div>
          </div>
          <div class="card-source">来源: 3. 现有的通信是否受影响</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
